<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        /* 什么是JSON?
        跨平台主流数据传输格式: json xml 
        JSON是有固定格式的字符串 
        
        json是跨平台主流数据传输格式
        JSON数据: 所有语言都认识的数据结构

        JSON的固定格式:  固定格式的字符串
        json格式 里面必须是双引号,外面是单引号  (js语言中双单引号都行,但是不能和别的语言通用)
        var str = '{"name":"张三","age":20,"height":"178cm"}'
        */
        //xml格式的JSON串
        // var str = "<xml version=1.0 encoding=utf-8>"+
        //            "<books>"+
        //                 "<nodejs>"+
        //                     "<bookname>"+
        //                         "nodejs从入门到精通"+
        //                         "</bookname>"+
        //                     "<price>"+
        //                         "$13"
        //                      "</price>"+
        //                 "</nodejs>"
        //             "</books>"

        /* 
            JSON使用
            1.JSON转换
            - JSON.stringify: 把js里的对象或者数组转成JSON字符串
            - JSON.parse : 可以把JSON字符串转成对象或者数组(转换的一定是一个纯JSON数据)
        */
        var arr = [{
            name: "张三",
            age: 20
        }, {
            name: "李四",
            age: 21
        }, {
            name: "王五",
            age: 22
        }];
        var jsonstr = JSON.stringify(arr);
        console.log(jsonstr); //[{"name":"张三","age":20},{"name":"李四","age":21},{"name":"王五","age":22}]
        var newarr = JSON.parse(jsonstr);
        console.log(newarr);
        /* 0: {name: '张三', age: 20}
        1: {name: '李四', age: 21}
        2: {name: '王五', age: 22} */

        /* 
        json作用: 
            1.前后端交互  主流数据
            2.深拷贝
            简单数据类型 : number string boolen undefined null bigInt symbol
            复杂数据类型 : object array function RegExp
        */
        var obj1 = {
            name: "张三",
            age: 20,
            fn: function () {
                console.log(1111);
            },
            a: undefined
        }
        //转为JSON串再转为对象
        var obj2 = JSON.parse(JSON.stringify(obj1));
        console.log(obj1); //{name: '张三', age: 20, a: undefined, fn: ƒ}
        console.log(obj2); // {name: '张三', age: 20}

        /* JSON  深拷贝有缺陷,会忽略 函数 undefined map set */


        /* 
            深拷贝:
                1.引用, 解决引用问题
                2.新创建一个对象或者是一个数组,开辟一个新的内存空间,把要拷贝数据加到新的对象或者数组里
                3.判断数据类型?
                    - typeof 简单数据类型和函数
                    - instanceof 判断实例和构造器在原型链上是否有关系
                    - ES5 精确判断数据类型 Object.prototype.toString.call(数据)
                    - constructor 判断数据类型
                4.深拷贝的深层对象或者是数组问题?
                    通过递归循环创建新的对象或者是数组
                5.解决for in 循环原型链的问题 
                    对象.hasOwnProperty(键名) 判断某个键名是否是自身属性
        */
    </script>
</body>

</html>